package brinaryTree;

import java.util.Stack;

/**
 * 538. 把二叉搜索树转换为累加树
 * <p>
 * 给出二叉 搜索 树的根节点，该树的节点值各不相同，请你将其转换为累加树（Greater Sum Tree），使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。
 * <p>
 * 提醒一下，二叉搜索树满足下列约束条件：
 * <p>
 * 节点的左子树仅包含键 小于 节点键的节点。
 * <p>
 * 节点的右子树仅包含键 大于 节点键的节点。
 * <p>
 * 左右子树也必须是二叉搜索树。
 */
public class N538_ConvertBSTToGreaterTree {
    private int pre = 0;

    public TreeNode convertBST(TreeNode root) {
        traversal(root);
        return root;
    }

    private void traversal(TreeNode node) {
        if (node == null) return;
        traversal(node.right);
        node.val += pre;
        pre = node.val;
        traversal(node.left);
    }

    public TreeNode convertBST_Iter(TreeNode root) {
        int pre = 0;
        Stack<TreeNode> s = new Stack<>();
        TreeNode cur = root;
        while (cur != null || !s.isEmpty()) {
            if (cur != null) {
                s.push(cur);
                cur = cur.right;
            } else {
                TreeNode node = s.pop();
                node.val += pre;
                pre = node.val;
                cur = node.left;
            }
        }
        return root;
    }
}
